﻿
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Transactions;
using Data.Contexto;
using Domain.Entidades;
using Domain.Interfaces.Repositorios;
using Domain.Interfaces.Servicos;
using MoreLinq;



namespace Data.Repositorios
{
    public class AfastamentoRepository : RepositoryBase<usuarios_afastados>,IAfastamentoRepository
    {

        protected credisiteContext Db = new credisiteContext();
        protected credigeralContext Dbseg = new credigeralContext();

        public IEnumerable<tipos_afastamento> busca_tipos()
        {
            try
            {

                return Dbseg.tipos_afastamento.OrderBy(x => x.tip_descricao).ToList();
            }
            catch (Exception ex)
            {
                
                throw ex;
            }


        }

        public void  Inserir(usuarios_afastados afastamento,VW_usuarios user)
        {
            try
            {
                IEnumerable<usuarios_afastados> afastamentos = Dbseg.usuarios_afastados.Where(x => x.usu_codigo == afastamento.usu_codigo);

                afastamentos = afastamentos.Where(x => (afastamento.data_inicio >= x.data_inicio && afastamento.data_inicio <= x.data_fim) || (afastamento.data_fim >= x.data_inicio  && afastamento.data_fim <= x.data_fim ) ||
               afastamento.data_inicio <=  x.data_inicio && afastamento.data_fim >= x.data_fim ).ToList();

                if (afastamentos.Count() > 0)
                {
                    throw new Exception("Ja existe um cadastro para este colaborador nesta data");

                }




                using (TransactionScope scope = new TransactionScope())
                {
                   

                    afastamento.data_cadastro = DateTime.Now;
                    Dbseg.usuarios_afastados.Add(afastamento);
                    Dbseg.SaveChanges();

                    log logs = new log();
                    logs.log_modulo = 3;
                    logs.log_tipo = 2207;
                    logs.log_descricao = "Afastamento codigo: " + afastamento.codigo;
                    logs.log_usuario = user.usu_codigo;
                    logs.log_data = DateTime.Now;
                    logs.log_horario = DateTime.Now.ToString("T");

                    Dbseg.log.Add(logs);
                    Dbseg.SaveChanges();
                    scope.Complete();
                }



            }
            catch (Exception ex)
            {

                throw ex;
            }


        }

        public void Editar(usuarios_afastados afastamento, VW_usuarios user)
        {
            try
            {

                IEnumerable<usuarios_afastados> afastamentos = Dbseg.usuarios_afastados.Where(x => x.usu_codigo == afastamento.usu_codigo && x.codigo != afastamento.codigo);

                afastamentos = afastamentos.Where(x => (afastamento.data_inicio >= x.data_inicio && afastamento.data_inicio <= x.data_fim) || (afastamento.data_fim >= x.data_inicio && afastamento.data_fim <= x.data_fim) ||
               afastamento.data_inicio <= x.data_inicio && afastamento.data_fim >= x.data_fim).ToList();

                if (afastamentos.Count() > 0)
                {
                    throw new Exception("Ja existe um cadastro para este colaborador nesta data");

                }


                using (TransactionScope scope = new TransactionScope())
                {



                    Dbseg.Set<usuarios_afastados>().AddOrUpdate(afastamento);
                    Dbseg.SaveChanges();

                    log logs = new log();
                    logs.log_modulo = 3;
                    logs.log_tipo = 2208;
                    logs.log_descricao = "Afastamento codigo: " + afastamento.codigo;
                    logs.log_usuario = user.usu_codigo;
                    logs.log_data = DateTime.Now;
                    logs.log_horario = DateTime.Now.ToString("T");

                    Dbseg.log.Add(logs);
                    Dbseg.SaveChanges();
                    scope.Complete();
                }



            }
            catch (Exception ex)
            {

                throw ex;
            }


        }

        public usuarios_afastados carrega_busca(int codigo)
        {

            try
            {
                return Dbseg.usuarios_afastados.FirstOrDefault(x => x.codigo == codigo);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

        }

        public void Deletar(usuarios_afastados afastamento, VW_usuarios user)
        {
            try
            {

                using (TransactionScope scope = new TransactionScope())
                {



                    Dbseg.usuarios_afastados.Remove(afastamento);
                    Dbseg.SaveChanges();

                    log logs = new log();
                    logs.log_modulo = 3;
                    logs.log_tipo = 2209;
                    logs.log_descricao = "Afastamento codigo: " + afastamento.codigo;
                    logs.log_usuario = user.usu_codigo;
                    logs.log_data = DateTime.Now;
                    logs.log_horario = DateTime.Now.ToString("T");

                    Dbseg.log.Add(logs);
                    Dbseg.SaveChanges();
                    scope.Complete();
                }



            }
            catch (Exception ex)
            {

                throw ex;
            }


        }

        public IEnumerable<VW_usuarios_afastados> Listar(DateTime dt1, DateTime dt2, int unidade )
        {
            try
            {
           
  
                IEnumerable<VW_usuarios_afastados> afastados = Dbseg.VW_usuarios_afastados.Where(x => x.data_cadastro >= dt1 && x.data_cadastro <= dt2).
                    OrderBy(x => new { x.uni_codigo, x.usu_nome}).OrderByDescending(x => new { x.data_cadastro, x.codigo}).ToList();


                if (unidade != -1)
                {
                    afastados = afastados.Where(x => x.uni_codigo == unidade);

                }
                return afastados;
            }
            catch (Exception ex)
               
            {
                throw ex;
            }


        }

    }
      }
 